package com.chara.rabbitmq_demo.com.chara.rabbitmq.pubSub;

import com.chara.rabbitmq_demo.com.chara.rabbitmq.utils.ConnectionUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * @Classname Producer
 * @Description 发布/订阅生产者
 * @Date 2025/10/9 21:04
 * @Author Chara
 */
public class Producer {

    public static void main(String[] args) throws Exception {

        // 1.获取连接
        Connection connection = ConnectionUtil.getConnection();

        // 2.创建频道
        Channel channel = connection.createChannel();

        String exchangeName = "demo_fanout";

        // 3.创建交换机
        /**
         * 参数1：exchange 交换机名称
         * 参数2：type 交换机类型
         * Direct：定向
         * Fanout：扇形(广播)，将消息交给所有绑定到交换机的队列
         * Topic：通配符，可以指定路由到队列
         * Headers：参数匹配
         * 参数3：durable 是否持久化
         * 参数4：autoDelete 是否自动删除
         * 参数5：internal 内部使用，一般false
         * 参数6：arguments 其他参数
         */
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT, true,false,false,null);

        // 4.创建队列
        String queue1Name = "fanout_queue1";
        String queue2Name = "fanout_queue2";

        channel.queueDeclare(queue1Name, true, false, false, null);
        channel.queueDeclare(queue2Name, true, false, false, null);

        // 5.指定队列和交换机
        // 参数1：queue 队列名称
        // 参数2：exchange 交换机名称
        // 参数3：routingKey 路由key
        // 如果交换机类型为fanout,routingKey设置为空字符串
        channel.queueBind(queue1Name, exchangeName, "");
        channel.queueBind(queue2Name, exchangeName, "");

        String body = "日志信息：张三调用了FindAll方法。。。日志级别info。。。";

        // 6.发送消息
        channel.basicPublish(exchangeName, "", null, body.getBytes());

        // 7.释放资源
        channel.close();
        connection.close();

    }
}
